/**
 * 全局错误处理工具
 */
import { ElMessage, ElNotification } from 'element-plus';

/**
 * 处理API请求错误
 * @param {Error} error - 错误对象
 * @param {string} defaultMessage - 默认错误消息
 * @param {boolean} showNotification - 是否显示通知而不是消息
 */
export const handleApiError = (error, defaultMessage = "操作失败", showNotification = false) => {
  if (error.name === 'AbortError') {
    return; // 忽略已取消的请求
  }
  
  console.error('API 错误:', error);
  
  let errorMessage = defaultMessage;
  
  if (error.response) {
    // 服务器响应错误
    const status = error.response.status;
    const responseData = error.response.data;
    
    // 根据状态码处理不同类型的错误
    switch (status) {
      case 400:
        errorMessage = responseData.message || '请求参数错误';
        break;
      case 401:
        errorMessage = '登录状态已过期，请重新登录';
        // 可以在这里处理登录状态失效的逻辑，如跳转到登录页
        break;
      case 403:
        errorMessage = '没有操作权限';
        break;
      case 404:
        errorMessage = '请求的资源不存在';
        break;
      case 429:
        errorMessage = '请求过于频繁，请稍后再试';
        break;
      case 500:
      case 502:
      case 503:
      case 504:
        errorMessage = '服务器错误，请稍后重试';
        break;
      default:
        errorMessage = responseData.message || defaultMessage;
    }
  } else if (error.request) {
    // 请求发送但没有收到响应
    errorMessage = '网络错误，请检查网络连接';
  } else {
    // 请求设置时发生错误
    errorMessage = error.message || defaultMessage;
  }
  
  // 显示错误消息
  if (showNotification) {
    ElNotification({
      title: '错误',
      message: errorMessage,
      type: 'error',
      duration: 5000
    });
  } else {
    ElMessage.error(errorMessage);
  }
  
  return errorMessage;
};

/**
 * 注册全局未捕获的异常处理
 */
export const setupGlobalErrorHandling = () => {
  // 处理未捕获的Promise异常
  window.addEventListener('unhandledrejection', (event) => {
    console.error('未处理的Promise拒绝:', event.reason);
    
    // 避免在控制台中显示重复错误
    event.preventDefault();
    
    // 如果是API错误，使用API错误处理
    if (event.reason.response || event.reason.request) {
      handleApiError(event.reason, '操作失败，请重试', true);
    } else {
      ElNotification({
        title: '应用错误',
        message: '应用发生了错误，请刷新页面重试',
        type: 'error',
        duration: 5000
      });
    }
  });
  
  // 处理未捕获的JS异常
  window.addEventListener('error', (event) => {
    console.error('未捕获的错误:', event.error);
    
    // 避免在控制台中显示重复错误
    event.preventDefault();
    
    ElNotification({
      title: '应用错误',
      message: '应用发生了错误，请刷新页面重试',
      type: 'error',
      duration: 5000
    });
  });
};

/**
 * Vue错误处理函数
 * @param {Error} err - 错误对象
 * @param {import('vue').ComponentPublicInstance} vm - Vue组件实例
 * @param {string} info - 错误信息
 */
export const vueErrorHandler = (err, vm, info) => {
  console.error('Vue错误:', err);
  console.error('组件:', vm);
  console.error('信息:', info);
  
  ElNotification({
    title: '组件错误',
    message: '应用发生了错误，请刷新页面重试',
    type: 'error',
    duration: 5000
  });
};

export default {
  handleApiError,
  setupGlobalErrorHandling,
  vueErrorHandler
}; 